#ifndef CORE_H
#define CORE_H

/*提供所有模块均使用的一些工具以及声明
*/

#include <stdint.h>
#include <string>

/*区分是否处于调试模式，处于调试模式时将输出一些调试信息*/
#define DEBUG

/*NDEBUG由C语言标准库的assert使用*/
#ifdef DEBUG
#undef NDEBUG
#else
#define NDEBUG
#endif

/*保存程序出现严重错误时的信息，供开发者查看
 */
class Error
{
private:
    uint32_t m_line_num;
    std::string m_file;
    std::string m_message;

public:
    Error(uint32_t lineNum, const std::string &file)
        :m_line_num(lineNum),m_file(file){}

    Error(uint32_t lineNum, const std::string &file, const std::string &message)
        :m_line_num(lineNum),m_file(file),m_message(message){}

    uint32_t getLineNum() const {
        return m_line_num;
    }

    std::string getFile() const {
        return m_file;
    }

    void setMessage(const std::string &message) {
        this->m_message = message;
    }

    std::string getMessage() const {
        return m_message;
    }
};

/*程序发生意料之外的错误时利用这个宏以某种方式报告错误，
 *此时程序应该尽快地退出，防止错误引起更多严重后果。
 * */
#define ERROR(msg) do{throw Error(__LINE__, __FILE__, (msg));}while(0)

/*输出一些帮助调试的信息，在调试模式下有效*/
#ifdef DEBUG
#include <stdio.h>
#define D(s) do{printf("-d->Debug message from line '%d' in '%s':\n%s\n", __LINE__, __FILE__, (s));}while(0)
#else
#define D(s) do{}while(0)
#endif

/*对应Linux内核的jiffies类型*/
typedef unsigned long jiffies_t;

#define KB (1024)
#define MB (1024 * KB)
#define GB (1024 * MB)

#endif // CORE_H

